home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / xinu.arc / CTXSW.MAC < prev    next >
Text File  |  1985-09-13  |  3KB  |  124 lines

  1. ;
  2. ;    C T X S W . M A C
  3. ;
  4. ;    This program performs context switching for
  5. ;    Xinu on Zilog Z-80 Micro's with Intel 8080 programs.
  6. ;    (It does not store the Z-80 registers)
  7. ;
  8. ;    Version 1.0 (Down and dirty)
  9. ;    S. R. Sampson, September 1985
  10. ;
  11. ;    The intent is to work with C/80(tm) Software Toolworks
  12. ;    which does not produce Z-80 Op-codes
  13. ;    and the Microsoft M80 assembler
  14. ;
  15. ;    Called with pointers to old and new registers
  16. ;
  17. ;    SP + 12    Old register pointer
  18. ;    SP + 10    New register pointer
  19. ;    SP + 8    Return Address
  20. ;
  21. ;    Registers stored as:
  22. ;
  23. ;    _______________________________
  24. ;    | PC | SP | HL | DE | BC | AF |
  25. ;    -------------------------------
  26. ;
  27. ;
  28.  
  29. CTXSW::
  30.     PUSH    PSW        ; SP + 6
  31.     PUSH    B        ; SP + 4
  32.     PUSH    D        ; SP + 2
  33.     PUSH    H        ; SP
  34.  
  35.     LXI    H,8
  36.     DAD    SP
  37.     MOV    C,M        ; get return address into BC register
  38.     INX    H        ; non-destructively
  39.     MOV    B,M
  40.  
  41.     LXI    H,12
  42.     DAD    SP
  43.     MOV    E,M        ; get old register pointer into DE
  44.     INX    H        ; non-destructively
  45.     MOV    D,M
  46.     XCHG            ; then HL
  47.     MOV    M,C
  48.     INX    H 
  49.     MOV    M,B        ; store return address as PC
  50.     INX    H
  51.     SHLD    POINT        ; store pointer temporarily
  52.  
  53.     LXI    H,8        ; SP should not reflect registers pushed
  54.     DAD    SP        ; by this module
  55.     XCHG            ; put SP into DE
  56.     LHLD    POINT        ; get old register pointer again
  57.     MOV    M,E 
  58.     INX    H 
  59.     MOV    M,D        ; store SP
  60.     INX    H 
  61.     SHLD    POINT        ; store the pointer
  62.  
  63.     POP    H 
  64.     XCHG            ; put HL in DE
  65.     LHLD    POINT        ; get old register pointer again
  66.     MOV    M,E 
  67.     INX    H 
  68.     MOV    M,D        ; store HL
  69.     INX    H 
  70.     SHLD    POINT        ; store the pointer
  71.  
  72.     POP    H 
  73.     XCHG            ; put DE into DE
  74.     LHLD    POINT        ; get old register pointer again
  75.     MOV    M,E 
  76.     INX    H 
  77.     MOV    M,D        ; store DE
  78.     INX    H 
  79.     SHLD    POINT        ; store the pointer
  80.  
  81.     POP    H 
  82.     XCHG            ; put BC into DE
  83.     LHLD    POINT        ; get old register pointer again
  84.     MOV    M,E 
  85.     INX    H 
  86.     MOV    M,D        ; store BC
  87.     INX    H 
  88.     SHLD    POINT        ; store the pointer
  89.  
  90.     POP    H 
  91.     XCHG            ; put AF into DE
  92.     LHLD    POINT        ; get old register pointer again (whew!)
  93.     MOV    M,E 
  94.     INX    H 
  95.     MOV    M,D        ; store AF
  96.  
  97. ;    SP now points at return address
  98.  
  99.     LXI    H,2        ; get new register pointer
  100.     DAD    SP        ; non-destructively
  101.     MOV    E,M 
  102.     INX    H 
  103.     MOV    D,M 
  104.     XCHG            ; HL now points at new registers
  105.     INX    H        ; PC is not needed except for debugging
  106.     INX    H        ; HL now points at new SP
  107.     SPHL            ; put stack pointer at new registers
  108.  
  109.     .Z80
  110.     POP    IX        ; get new SP into IX
  111.     POP    HL        ; scoop out new registers
  112.     POP    DE 
  113.     POP    BC 
  114.     POP    AF 
  115.     LD    SP,IX        ; SP is now set up
  116.     .8080
  117.  
  118.     EI
  119.     RET            ; new process is ready
  120.  
  121. POINT:    DW    0        ; temporary storage
  122.  
  123.     END
  124.